---
slug: 2024-03-30-copy-constructor-and-initialization-lists
title: Конструктор копирования и список инициализации
authors: [aladin]
tags: [разработка]
---

В данной статье представлен пример работы конструктора копирования в списке инициализации.

<!--truncate-->

В примере ниже демонстрируется, что в списках инициализации используются конструкторы копирования. Обратите внимание, что использование унифицированной инициализации `{}` в списке инициализации в конструкторе с параметрами `explicit C(const A &a, const B &b)` также вызывает конструктор копирования, как и `()`: `a_(a), b_{b}`.

```cpp
#include <iostream>
using namespace std;

class A {
 protected:
  int value_;

 public:
  A() : value_{} { cout << "A()" << endl; }
  A(const A &a) {
    cout << "A(B&)" << endl;
    value_ = a.value_;
  }
};

class B : public A {
 public:
  B() : A() { cout << "B()" << endl; }
  B(const B &b) : A(b) { cout << "B(B&)" << endl; }
};

class C {
  A a_;
  B b_;

 public:
  C() : a_{}, b_{} { cout << "C()" << endl; }
  C(const C &c) : a_(c.a_), b_(c.b_) { cout << "C(C&)" << endl; }
  explicit C(const A &a, const B &b) : a_(a), b_{b} {
    cout << "C(A&,B&)" << endl;
  }
};

int main() {
  A a;                     // A()
  cout << "----" << endl;  // ----
  B b;                     // A()
                           // B()
  cout << "----" << endl;  // ----
  C c1;                    // A()
                           // A()
                           // B()
                           // C()
  cout << "----" << endl;  // ----
  C c2(a, b);              // A(B&)
                           // A(B&)
                           // B(B&)
                           // C(A&,B&)
  cout << "----" << endl;  // ----
  C c3(c2);                // A(B&)
                           // A(B&)
                           // B(B&)
                           // C(C&)
}
```
